小编典典

jQuery Ajax 调用和 Html.AntiForgeryToken()

all

根据我在互联网上的一些博客文章中阅读的信息,我已经在我的应用程序中实现了对CSRF
攻击
的缓解。特别是这些帖子是我实施的驱动力

基本上这些文章和建议说,为了防止 CSRF 攻击,任何人都应该实现以下代码:

  1. 添加[ValidateAntiForgeryToken]接受 POST Http 动词的每个动作

[HttpPost] [ValidateAntiForgeryToken] public ActionResult SomeAction(
SomeModel model ) { }

  1. <%= Html.AntiForgeryToken() %>在向服务器提交数据的表单中添加助手

无论如何,在我的应用程序的某些部分,我正在使用 jQuery 向服务器发送 Ajax
POST,根本没有任何形式。例如,当我让用户单击图像以执行特定操作时,就会发生这种情况。

假设我有一张包含活动列表的表格。我在表格的一列上有一张图片,上面写着“将活动标记为已完成”,当用户单击该活动时,我正在执行 Ajax POST,如下例所示:

$("a.markAsDone").click(function (event) {
    event.preventDefault();
    $.ajax({
        type: "post",
        dataType: "html",
        url: $(this).attr("rel"),
        data: {},
        success: function (response) {
            // ....
        }
    });
});

<%= Html.AntiForgeryToken() %>在这些情况下我该如何使用?我应该在 Ajax 调用的 data 参数中包含辅助调用吗?

对不起,很长的帖子,非常感谢您的帮助

编辑

根据jayrdub的回答,我使用了以下方式

$("a.markAsDone").click(function (event) {
    event.preventDefault();
    $.ajax({
        type: "post",
        dataType: "html",
        url: $(this).attr("rel"),
        data: {
            AddAntiForgeryToken({}),
            id: parseInt($(this).attr("title"))
        },
        success: function (response) {
            // ....
        }
    });
});

阅读 150

收藏
2022-06-21

共1个答案

小编典典

我使用这样的简单js函数

AddAntiForgeryToken = function(data) {
    data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
    return data;
};

由于页面上的每个表单都将具有相同的令牌值,因此只需在最顶层的母版页中添加类似的内容

<%-- used for ajax in AddAntiForgeryToken() --%>
<form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form>

然后在您的 ajax 调用中执行(编辑以匹配您的第二个示例)

$.ajax({
    type: "post",
    dataType: "html",
    url: $(this).attr("rel"),
    data: AddAntiForgeryToken({ id: parseInt($(this).attr("title")) }),
    success: function (response) {
        // ....
    }
});
2022-06-21